package list;

/**
 * Java提供的最基本的集合类型就是数组，但是数组有一个缺陷，就是在创建数组时，必须确定数组的大小。
 * 这是因为数组是顺序存取，需要在创建时一次性分配内存，这样数组中每一个元素的物理地址就可以提前确定，所以获取数组中某一个元素是非常快速的。
 *
 * [ 1 ] [ 2 ]
 */
public class ArrayList<E> {

    private E[] elementData;

    private int size;

    public int size() {
        return size;
    }

    public boolean add(E element) {
        // 第一步：自动扩容
        ensureCapacityInternal();
        // 第二步：将元素添加至队列尾部，并维护队列长度
        elementData[size++] = element;
        return true;
    }

    public boolean add(int index, E element) {
        // 第一步：检查 index 是否越界
        rangeCheck(index);
        // 第二步：自动扩容
        ensureCapacityInternal();
        // 第三步：将 index 位置之后的所有元素向后移一位
        System.arraycopy(elementData, index, elementData, index + 1, size - index);
        // 第四步：将元素添加至队列指定位置，并维护队列长度
        elementData[index] = element;
        size++;
        return true;
    }

    public E remove(int index) {return null;}

    public boolean remove(E element) {return true;}

    public E get(int index) {
        // 第一步：检查 index 是否越界
        rangeCheck(index);
        // 第二步：获取指定位置元素
        return elementData[index];
    }

    public E set(int index, E element) {
        // 第一步：检查 index 是否越界
        rangeCheck(index);
        // 第二步：替换指定位置元素
        E oldElement = elementData[index];
        elementData[index] = element;
        return oldElement;
    }

    private void rangeCheck(int index) {
        if (index >= elementData.length) {
            throw new IndexOutOfBoundsException();
        }
    }

    private void ensureCapacityInternal() {
        int targetSize = this.size + 1;
        // 如果新增元素后的长度大于数据长度
        if (targetSize > elementData.length) {
            // 执行扩容
        }
    }

    public static void main(String[] args) {
        String[] ary = new String[10];
        System.out.println(ary.length);
    }

}
